#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

// 互斥锁变量
pthread_mutex_t mutex;

void * funA(void * arg){
    // 加锁
    pthread_mutex_lock(&mutex);
    for(int c = 'A';c <= 'Z'; c++){
        putchar(c);
        fflush(stdout);
        usleep(100000);
    }
    // 解锁
    pthread_mutex_unlock(&mutex);
    return NULL;
}

void * funa(void * arg){
    // 加锁
    pthread_mutex_lock(&mutex);
    for(int c = 'a';c <= 'z'; c++){
        putchar(c);
        fflush(stdout);
        usleep(100000);
    }
    // 解锁
    pthread_mutex_unlock(&mutex);
    return NULL;
}

/**
 * 互斥锁
 *      在访问临界资源前加锁
 *      访问资源结束后解锁
 *      对任何试图再次对互斥锁加锁的线程会被阻塞，知道锁释放
 * @return
 */
int main(){
    pthread_t tid1;
    pthread_t tid2;

    int ret = -1;

    // 初始化
    ret = pthread_mutex_init(&mutex,NULL);

    printf("初始化 互斥锁 成功！");

    memset(&tid1,0,sizeof(tid1));
    memset(&tid2,0,sizeof(tid2));
    ret = pthread_create(&tid1,NULL,funA,NULL);
    ret = pthread_create(&tid2,NULL,funa,NULL);
    printf("main run\n");
    // 阻塞等待线程运行结束，并且获取线程的返回指针
    ret = pthread_join(tid1,NULL);
    ret = pthread_join(tid2,NULL);
    printf("\n");
    printf("main exit\n");
    // 销毁
    pthread_mutex_destroy(&mutex);
    printf("销毁 互斥锁 成功！\n");
    return 0;
}
